package com.atguigu.mybatis.mapper;


import com.atguigu.mybatis.bean.Emp;
import com.atguigu.mybatis.bean.Employee;
import com.atguigu.mybatis.bean.MyParam;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/*
Create by Smexy on 2023/5/30
 */
//public interface TestPassParamMapper {
//    /*
//    mapper.getEmployee("a","b",1,3,4)
//    如果方法参数列表有多个，此时#{xxx}不能乱写
//            此时可用的xxx是：param1--paramN
//                            arg0---argN
//     */
//    @Select("select * from employee where id = #{arg3}")
//    Employee getEmployee(String p1,String p2,Integer p3,Integer p4,Integer p5);
//
//    /*
//    如果方法的列表中有多个参数，可以尝试把多个参数封装为Bean
//          想获取哪个参数，就使用#{属性名}就可以获取
//          MyParam myParam = new MyParam("3","4",5,3,4);
//          System.out.println(mapper.getEmployee2(myParam));
//     */
//    @Select("select * from employee where id = #{p5}")
//    Employee getEmployee2(MyParam myParam);
//
//    /*
//     {“a"：3，”b“:4,....}
//     #{xxx}:xxx只需要写map中指定的key，可以和获取key对应的value
//     */
//    @Select("select * from employee where id = #{a}")
//    Employee getEmployee3(Map<String,Object> map);
//
//    /*
//    mapper.getEmployee4("1","3")
//
//    命名参数：不使用系统提供的 argx , paramx ,而是自己给参数起名字
//     */
//    @Select("select * from employee where id = #{b}")
//    Employee getEmployee4(@Param("p1") String p1,@Param("b") String p2);
//
//    /*
//    #{}：特点是可以根据你所传入的参数类型，对参数进行处理
//            传入的是String类型的参数，会自动为参数添加''。
//         在sql的某些位置，不需要你给我添加引导，只需要给我拼接即可，例如表名位置。
//    ${}:和#{}作用基本一样，是直接拼接
//
//    使用时：参数位置一般用#{},其他拼接sql的位置要使用${}
//     */
//    @Select("select * from employee where id = #{b}")
//    Employee getEmployee5(@Param("p1") String p1,@Param("b") String p2);
//
//    //编写这个方法是希望根据id查询员工
//    @Select("select * from employee where id = #{b}")
//    List<Employee> getEmployee6(@Param("b") String id);
//
//    /*
//                id  last_name  gender  email
//        ------  ---------  ------  -------------
//             3  jackma     female  Tom@163.com
//
//        resultType的封装规则：
//        Emp e = new Emp();
//        e.setId(3);
//        e.setLastName(jackma);
//        e.setGender(female) 不成功
//        e.setEmail(Tom@162.com) 不成
//
//        如果返回的列名和Bean的字段名差别很大，根本对不上，那么resultType的封装规则将失效！
//                必须使用resultMap(自己配置列名和属性名的对应关系)
//     */
//    @Select("select * from employee where id = #{b}")
//    //封装结果时，参考id为rm的封装规则
//    @ResultMap("resultMaps.rm")
//    Emp getEmp(Integer id);
//}


public interface TestPassParamMapper {
    /*
    mapper.getEmployee("a","b",1,2,3)
    如果方法参数列表有多个，此时#{xxx}不能乱写
        此时可用的xxx是：param1--paramN
                        arg0--argN
     */
    @Select("select * from employee where id = #{arg3}")
    Employee getEmployee(String p1,String p2,Integer p3,Integer p4,Integer p5);


    /*
    如果方法参数列表有多个，可以尝试把多个参数封装为Bean
           想获取哪个参数，就使用#{属性名}可以获取
           MyParam myParam = new MyParam("3","4",5,4,3);
           System.out.println(mapper.getEmployee2(myParam));
     */
    @Select("select * from employee where id = #{p5}")
    Employee getEmployee2(MyParam myParam);


    /*
    {"a"："3"，“b”:"4",...}
    #{xxx}：xxx只需要写map中指定的key，就可以获取key对应的value
     */
    @Select("select * from employee where id = #{a}")
    Employee getEmployee3(Map<String,Object> map);


    /*
    mapper.getEmployee4("1","3")

    命名参数：不使用系统提供的 argx,paramx 而是自己给参数起名字
     */
    @Select("select * from employee where id = #{b}")
    Employee getEmployee4(@Param("p1") String p1,@Param("b") String p2);


    /*
        #{}：特点是可以根据你所传入的参数类型，对参数进行处理
            传入的是String类型的参数，会自动为参数添加''。
        在sql的某些位置，不需要你给我添加引导，只需要给我拼接即可，例如表名位置

        ${}:和#{}作用基本一样，是直接拼接
        使用时：参数位置一般用#{}，其他拼接sql的位置要使用${}
     */
    @Select("select * from ${t} where id = #{b}")
    Employee getEmployee5(@Param("t") String table,@Param("b") Integer id);

    //编写这个方法实现希望根据id查询员工id
    @Select("select * from employee where id = #{b}")
    List<Employee> getEmployee6(@Param("b") String id);

    /*
            id   last_name   gender   email
         ------  ---------  ------   -------------
            3      jackma   female   Tom@163.com

            resultType的封装规则：
                Emp e = new Emp();
                e.setId(3);
                e.setLastName(jackma);
                e.setGender(female)  不成功
                e.setEmail(Tom@162.com)  不成

                如果返回的列名和Bean的字段名差别很大，根本对不上，那么resultType的封装规则将失效！
                        必须使用resultType(自己配置列名和属性名的对应关系)
     */
    @Select("select * from employee where id = #{b}")
    //封装结果时，参考id为rm的封装规则
    @ResultMap("resultMaps.rm")
    Emp getEmp(Integer id);
}